package com.malou.server.ventas.venta;

import java.sql.SQLException;
import java.util.List;

import com.extjs.gxt.ui.client.data.BasePagingLoadResult;
import com.extjs.gxt.ui.client.data.PagingLoadResult;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.malou.client.ventas.venta.DetalleVenta;
import com.malou.client.ventas.venta.Venta;
import com.malou.server.base.Conexion;
import com.malou.server.base.util.GxtGridPaginate;
import com.malou.server.ventas.ingresostock.IngresoStocks;
import com.malou.server.ventas.serie.Series;

public class Ventas {
	
	public static SqlMapClient sqlMap = null;
	public static Integer errorTipo = 0;
	public static String modeloPrenda = "";
	
	@SuppressWarnings("unchecked")
	public static PagingLoadResult<Venta> getPaginate(GxtGridPaginate paginate) {		     
		
		sqlMap = Conexion.getSqlMap();
		paginate.setLimit();
		
		paginate.condition = paginate.condition.replace("documento", "td.descripcion");
		paginate.condition = paginate.condition.replace("fecha", "v.fecha");
		
		if(paginate.order.equals("")){
			paginate.order = " order by id desc";
		}
		List<Venta> data = null;
		try {
			data = sqlMap.queryForList("paginateVenta", paginate);				
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return new BasePagingLoadResult<Venta>(data, paginate.offset, count(paginate));
	}
	
	public static Integer count(GxtGridPaginate paginate){
		Integer count = null;
		try {
			count = (Integer) sqlMap.queryForObject("countVenta", paginate);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return count;
	}
	
	@SuppressWarnings("unchecked")
	public static List<DetalleVenta> getDetalle(Integer venta_id) {			
		sqlMap = Conexion.getSqlMap();
		
		List<DetalleVenta> data = null;
		try {
			data = sqlMap.queryForList("getDetalleVenta", venta_id);				
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return data;
	}

	public static boolean save(Venta v, List<DetalleVenta> list) {
		boolean retorno = true;		
        sqlMap = Conexion.getSqlMap();
        try {
        	Series.sqlMap = sqlMap;        	
        	sqlMap.startTransaction();      	
        	
        	if(Series.hasSerie(v.getTienda_id(), v.getTipodocumento_id())){
        			
        		v.setNumero(Series.actualizarNumeracion(v.getTienda_id(), v.getTipodocumento_id()));
        		
        		sqlMap.insert("insertVenta", v);
        		
        		Integer venta_id = v.getId();
        		Integer tienda_id = v.getTienda_id();
        		
        		IngresoStocks.sqlMap = sqlMap;
        		for(DetalleVenta dv : list){
        			dv.setVenta_id(venta_id);
        			if(IngresoStocks.hasStock(dv.getModeloprenda_id(), dv.getCantidad(), tienda_id)){
        				sqlMap.insert("insertDetalleVenta", dv);
        				IngresoStocks.disminuyeStockTienda(dv.getModeloprenda_id(), dv.getCantidad(), tienda_id);        				
        			}else{        				
        				sqlMap.endTransaction();
        				retorno = false;
        				errorTipo = 2; //stock insuficiente
        				modeloPrenda = dv.getModeloprenda();
        				break;        				
        			}
        		}
        		
        		if(retorno){        		        			
	        		sqlMap.commitTransaction();
        		}
        	}else{
        		retorno = false;    
        		errorTipo = 1; //no existe serie
        	}
        } catch (SQLException e) {
        	retorno = false;        	
			e.printStackTrace();
		}
        
     	try {
			sqlMap.endTransaction();
		} catch (SQLException e) {				
			e.printStackTrace();
		}
         
        return retorno;
	}
	
	public static boolean saveSeparacion(Venta v, List<DetalleVenta> list) throws SQLException {
		boolean retorno = true;        
        
    	Series.sqlMap = sqlMap;        	    	
    	
    	if(Series.hasSerie(v.getTienda_id(), v.getTipodocumento_id())){
    			
    		v.setNumero(Series.actualizarNumeracion(v.getTienda_id(), v.getTipodocumento_id()));
    		
    		sqlMap.insert("insertVenta", v);
    		
    		Integer venta_id = v.getId();
    		
    		IngresoStocks.sqlMap = sqlMap;
    		for(DetalleVenta dv : list){
    			dv.setVenta_id(venta_id);        			
    			sqlMap.insert("insertDetalleVenta", dv);        			
    		}
    		
    		
    	}else{
    		retorno = false;    
    		errorTipo = 1; //no existe serie
    	}
              
         
        return retorno;
	}
	
	public static boolean anular(Integer id) {
		boolean retorno = true;
		
        try {
        	anularVenta(id);       	
        } catch (SQLException e) {
        	retorno = false;
			e.printStackTrace();
		}    	
        
        return retorno;
	}

	public static boolean anularAll(List<Integer> ids) {
		boolean retorno = true;
		
        try {
        	for(Integer id: ids){
        		anularVenta(id);
        	}        	    	
        } catch (SQLException e) {
        	retorno = false;
			e.printStackTrace();
		}    	
        
        return retorno;
	}
	
	@SuppressWarnings("unchecked")
	private static void anularVenta(Integer id) throws SQLException {		
		Venta v = null;
		
		List<DetalleVenta> list = null;
		Integer tienda_id = null;		
        sqlMap = Conexion.getSqlMap();
        
    	sqlMap.startTransaction();
    	
    	sqlMap.update("anulaVenta", id);
    	v = (Venta)sqlMap.queryForObject("getVenta", id);
    	
    	list = sqlMap.queryForList("getDetalleVenta", id);
    	IngresoStocks.sqlMap = sqlMap;
    	tienda_id = v.getTienda_id();
    	for(DetalleVenta dv : list){
    		IngresoStocks.incrementaStockTienda(dv.getModeloprenda_id(), dv.getCantidad(), tienda_id);
    	}
    	
    	sqlMap.commitTransaction();        	
    	sqlMap.endTransaction();
	}

	
}